import 'package:api/pages/apps/changeDayAndLight/theme_config.dart';
import 'package:provide/provide.dart';

class ProvideConfig {
  /**
   * Provide 也借助了InheritWidget 将共享状态放到了顶层MaterialApp之上
   * 底层部件通过Provider获取该状态 并通过混合ChangeNotifier通知依赖于改状态的组件刷新
   */
  // 用于初始化Provider 以及ThemeConfigModel
  static init({child, dispose = false}) {
    /**
     * Proveder.value 将ThemeConfigModel包裹成 _ValueProvider
     * 并将它的内部提供了StreamController 从而实现对数据进行流式操作。
     * 
     */
    // 初始化 providers
    final providers = Providers()..provide(Provider.value(ThemeConfigModel()));
    /**
     * ProviderNode封装了InheritWidget,并提供了一个providers容器放置状态
     * 
     */
    // [child] 指的是要进行 状态管理的子Widget
    // [providers] 状态的管理器
    return ProviderNode(child: child, providers: providers, dispose: dispose);
  }

  // 通过Provider小部件获取状态封装
  static connect<T>({builder, child, scope}) {
    return Provide<T>(builder: builder, child: child, scope: scope);
  }

  // 通过Provide.value<T>(context) 获取封装
  static T value<T>(context, {scope}) {
    /**
     * Provide提供了两种获取State的方法
     * 这里使用的是 Provide.value<T>(context)
     * 这种方法实际上调用了context.inheritFromWidgetOfExactType找到顶层的_InheritedProviders来获取到顶层providers中的状态
     */
    return Provide.value<T>(context, scope: scope);
  }
}
